﻿//#include <iostream>
//using namespace std;
//
//const int N = 2010;
//const int F = 1010;
//const int MOD = 1e8;
//
//// 从前i 头奶⽜中挑选，总和模f 之后为j 时，⼀共有多少种组合
//int dp[N][F] = { 0 };
//
//int n, m;
//int a[N] = { 0 };
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i];
//	}
//	dp[0][0] = 1;
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 0; j < m; j++)
//		{
//			dp[i][j] += dp[i - 1][j];
//			dp[i][j] += dp[i - 1][(j - (a[i] % m) + m) % m];
//			dp[i][j] %= MOD;
//		}
//	}
//	cout << dp[n][0] - 1 << endl;
//	return 0;
//}


//#include <iostream>
//#include <cstring>
//using namespace std;
//
//const int N = 110;
//const int M = 10010;
//
//int a[N][N] = { 0 };
//int t, n, m;
//
//// 从前i个中选， 总价值不超过j的情况下的最大利润
//int dp[M] = { 0 };
//
//int slove(int* v, int* w)
//{
//	memset(dp, 0, sizeof(dp));
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = v[i]; j <= m; j++)
//		{
//			dp[j] = max(dp[j], dp[j - v[i]] + w[i] - v[i]);
//		}
//	}
//
//	return m + dp[m];
//}
//
//int main()
//{
//	cin >> t >> n >> m;
//	for (int i = 1; i <= t; i++)
//	{
//		for (int j = 1; j <= n; j++)
//		{
//			cin >> a[i][j];
//		}
//	}
//	for (int i = 1; i < t ; i++)
//	{
//		m = slove(a[i], a[i + 1]);
//	}
//
//	cout << m << endl;
//	return 0;
//}



////P1083 [NOIP 2012 提高组] 借教室
//
//#include <iostream>
//using namespace std;
//
//const int N = 1e6 + 10;
//
//int n, m;
//int r[N] = { 0 };
//int d[N] = { 0 };
//int s[N] = { 0 };
//int t[N] = { 0 };
//
//int f[N] = { 0 }; //差分数组
//
//bool st = 1;
//
//bool check(int x)
//{
//	for (int i = 1; i <= n; i++)
//	{
//		f[i] = r[i] - r[i - 1];
//	}
//
//	for (int i = 1; i <= x; i++)
//	{
//		f[s[i]] -= d[i];
//		f[t[i] + 1] += d[i];
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		f[i] = f[i] + f[i - 1];
//		if (f[i] < 0)
//		{
//			st = 0;
//			return false;
//		}
//	}
//
//	return true;
//}
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> r[i];
//	}
//	for (int i = 1; i <= m; i++)
//	{
//		cin >> d[i] >> s[i] >> t[i];
//	}
//
//	int l = 1;
//	int r = m;
//	while (l < r)
//	{
//		int mid = (r + l) / 2;
//		if (check(mid))
//		{
//			l = mid + 1;
//		}
//		else
//		{
//			r = mid;
//		}
//	}
//
//	if (st)
//		cout << 0 << endl;
//	else
//		cout << -1 << endl << l;
//
//	return 0;
//}



//#define _CRT_SECURE_NO_WARNINGS
//
//#include <iostream>
//
//#define ll long long
//using namespace std;
//
//int main()
//{
//	ll t;
//	scanf("%lld", &t);
//	for (ll i = 0; i < t; i++) 
//	{
//		int flag = 0;
//		string s1, s2, s3;
//		cin >> s1 >> s2 >> s3;
//		if (s1.size() != s2.size()) 
//		{
//			printf("NO\n");
//			continue;
//		}
//		if (s1.size() != s3.size()) 
//		{
//			printf("YES\n");
//			continue;
//		}
//		for (ll j = 0; j < s3.size(); j++) 
//		{
//			if (s3[j] != s1[j] && s3[j] != s2[j]) 
//			{
//				printf("YES\n");
//				flag = 1;
//				break;
//			}
//		}
//		if (flag == 0) 
//		{
//			printf("NO\n");
//		}
//	}
//	return 0;
//}


//#include <iostream>
//#include <string>
//#include <unordered_map>
//using namespace std;
//
//string a, b, c;
//unordered_map<char, char> mp;
//
//void solve()
//{
//	mp.clear();
//	cin >> a >> b >> c;
//	if (a.size() != b.size())
//	{
//		cout << "NO" << '\n';
//		return;
//	}
//	if (a.size() != b.size())
//	{
//		cout << "YES" << '\n';
//		return;
//	}
//	for (int i = 0; i < a.size(); i++)
//	{
//		if (mp.count(a[i]))
//			a[i] = mp[a[i]];
//		if (mp.count(b[i]))
//			b[i] = mp[b[i]];
//		
//		if (a[i] != b[i])
//		{
//			if (mp.count(a[i]) == 0)
//			{
//				mp.insert({ a[i], b[i] });
//				mp[a[i]] = b[i];
//				a[i] = b[i];
//			}
//			else if (mp.count(b[i]) == 0)
//			{
//				mp.insert({ b[i], a[i] });
//				mp[b[i]] = a[i];
//				b[i] = a[i];
//			}
//			else
//			{
//				cout << "NO" << '\n';
//				return;
//			}
//		}
//
//		for (int i = 0; i < c.size(); i++)
//		{
//			if(mp.count(c[i]))
//				c[i] = mp[c[i]];
//		}
//
//		
//	}
//	if (c == b)
//		cout << "NO" << '\n';
//	else
//		cout << "YES" << '\n';
//
//}
//
//int main()
//{
//	int t;
//	cin >> t;
//	while (t--)
//	{
//		solve();
//	}
//	return 0;
//}


#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1e5 + 10;

int t, n, f;

struct node
{
	int id, left, right;
}a[N];

bool st[N] = { 0 };
int idx[N] = { 0 };
int pos = 0;

bool cmp1(node& x, node& y)
{
	return x.left < y.left;
}

bool cmp2(node& x, node& y)
{
	return x.right > y.right;
}

void solve()
{
	pos = 0;
	long long ans = 0;

	cin >> n >> f;
	for (int i = 1; i <= n; i++)
	{
		st[i] = 0;
		cin >> a[i].left >> a[i].right;
		a[i].id = i;
	}

	// 左端点 升序 排序
	sort(a + 1, a + 1 + n, cmp1);
	for (int i = 1; i <= n; i++)
	{
		if (a[i].right >= f)
		{
			ans += max(0, a[i].left - f);
			ans += a[i].right - a[i].left;
			f = a[i].right;
			idx[++pos] = a[i].id;
			st[a[i].id] = 1;
		}
	}

	// 右端点降序排序
	sort(a + 1, a + 1 + n, cmp2);
	for (int i = 1; i <= n; i++)
	{
		if (st[a[i].id] == 1)
			continue;

		st[a[i].id] = 1;
		ans += a[i].right - a[i].left;
		idx[++pos] = a[i].id;
	}

	cout << ans << endl;
	for (int i = 1; i <= n; i++)
		cout << idx[i] << " ";
	cout << endl;

}


int main()
{
	cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}